iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Modern Web

小白大戰基礎網頁開發系列 第 29

D29 - Databases 資料庫

  • 分享至 

  • xImage
  •  

Database 是甚麼?

Databases 是相關訊息的集合, 類似於 JSON, 但更表格化些。
那麼你有想到哪些 data 範例可以儲存在 database 中呢?

  • 書評
  • 商店庫存
  • 使用者訊息
  • 餐廳菜單
  • 電影/遊戲
  • 寶可夢圖鑑

Database (資料庫) 為我們構建、處理和檢索大型資料集的方式做了很大的改進。 大多數軟體公司都會有一個專門從事資料庫管理的大型團隊。

Database 的優勢:

  • 功能強大: 可以搜索、過濾資料、合併來自多個資源的資料。
  • 快速: 與 file/JSON 相比, 可以非常快速地搜尋以及過濾資料庫。
  • : 可以很合適地把資料庫大小擴展到非常大。
  • 安全: 用於操作失敗 (failure) 後恢復 (recovery) 的內建機制
  • 多用戶: Concurrency (並發性) 允許讓許多使用者同時查看/編輯資料。
  • 抽象 (abstract): 在儲存的資料和應用程式之間提供抽象層 —— 許多資料庫 program 都可以理解相同的 commands。

關聯式資料庫 (Relational Database)

將資料結構化為與共享屬性 (shared attributes) 有關聯的表格 (table)。

更詳細的解釋:

關係式資料庫是一種資料庫,用於儲存並存取相關的資料點。關聯式資料庫的基礎建立於關聯模型之上,以直接且直覺的方式於資料表上顯示資料。在關係式資料庫中,資料表中的每一列資料行都是一條記錄,並有唯一的ID,稱為索引鍵。資料表的資料列中存放著資料的屬性,每條記錄通常有一個屬性值,這樣就很容易建立資料點之間的關係。

參考資料: https://www.oracle.com/tw/database/what-is-a-relational-database/

從上圖 Excel 範例來看:

  • 一行表格對應於稱為記錄(綠色)或元組的資料單元。
  • 一列表格對應於該記錄的一個屬性(藍色)。

其實表格 (Tables) 可以做到像 Excel 工作表一樣呈現資料可視覺化, 只是具有不同的術語和更多的程序化功能。
表格範例:

SQL (Structured Query Language)

  • 一種用於搜索/更新資料庫的語言。專為資料訪問資料管理而設計的特定領域語言(Domain-Specific Language), 而 HTML 其實也是一種 DSL。
  • 大多數 關係資料庫管理系統 (RDBMS - Relational Database Management System)都使用 SQL 來管理以 table 形式儲存的資料。
  • SQL 是一種宣告式語言 (Declarative Language): 表達你要查找的資料, 而不是確切的查找方法。
    • HTML: 標記語言; JavaScript: 命令式語言 (Imperative Language)
  • You write statements in SQL!
  • 我們主要將會看到兩種不同類型的 statements:
    • Data Definition (資料定義): 一般來說指的是資料是什麼樣的
    • Data Manipulation (資料操作): 更改或訪問資料

CREATE TABLE

[CREATE TABLE](https://www.w3schools.com/sql/sql_create_table.asp) 用於創建新表格。

CREATE TABLE table_name(
  column1 datatype PRIMARY KEY,
  column2 datatype,
  column3 datatype,
  .....
  columnN datatype
);

.sql File Example:

-- comment in sqlite
CREATE TABLE Games(
  id INTEGER  NOT NULL PRIMARY KEY,
  name VARCHAR(106),
  platform VARCHAR(32) NOT NULL,
  release_year INTEGER NOT NULL,
  genre VARCHAR(28),
  publisher VARCHAR(50) NOT NULL,
  developer VARCHAR(50),
  rating VARCHAR(50)
);

SQL Type convert to SQLite Type

Static SQL Type SQLite Type
INT INTEGER
VARCHAR(n) TEXT
TINYINT INTEGER
DATETIME NUMERIC (包含: “Strings”, Dates, Booleans)
DOUBLE REAL
TEXT TEXT

以下這些稱為 Constraints - 它們有條件地約束你可以在欄位中存入的值的類型。

  • PRIMARY KEY (keyname): 用於指定一欄位或一組欄位為唯一標識資料表中的一行 (row)。
  • AUTOINCREMENT: 與整數 primary key 欄位一起使用以自動生成 key 的 “next”值。此欄位內容會自動遞。在 SQLite 中, 僅可用於作為 INTEGER 的 primary key。

SQLite AUTOINCREMENT is a keyword used for auto incrementing a value of a field in the table.

  • NOT NULL: 防止欄位中出現 NULL entries (值不可為空), 需要在 INSERT statements中來設定值。
  • DEFAULT: 如果未在 INSERT statement 中提供的話, 則指定欄位的預設值。
  • UNIQUE: 要求屬性是 unique, 也就是說此欄位不能重複 (對於不是 PRIMARY KEY 但仍然應該是 unique 的 field 很有用)。

這邊提供兩個不錯的 Constraints 學習連結:

  1. https://www.tutorialrepublic.com/sql-tutorial/sql-constraints.php
  2. https://www.1keydata.com/tw/sql/sql.html

先下載完 DB Browser for SQLite 後, 我們可以新建一個資料庫檔案。
點選左上角的 New Database, 在選好資料庫檔案儲存路徑後, 為檔案命名完成。
建立完成後, 會跳出一個 Edit table definition 視窗, 我們可以在這邊新建 table (資料表)。定義完 table 名稱後, 點選下方的Add 允許我們增加資料表欄位。馬上來新增兩個欄位看看,

INSERT

要將新 record 存入表中, 我們使用 INSERT INTO 關鍵字。

INSERT INTO Games(id,name,platform,release_year,genre,publisher,developer,rating)
  VALUES (1,'Pokemon Red/Blue','GB','1996','Role-Playing','Nintendo','Game Frea                 k','E');

首先提供 table name, 然後提供要設置的列表(預設情況下它會設置所有欄位)。 遺漏的欄位將設置為 NULL, 除非它們設置了 AUTOINCREMENT。然後為每列欄位提供與指定的欄位名匹配的值。

在新建好的 table 點擊右鍵中的 Browse Table 可以瀏覽資料表的資訊

進來可以看到 table, 想要存入資料的話, 點選 GUI 中的 Insert a new record in the current table, 便可新增欄位。點選目標欄位, 並且在右邊的 Edit Databse Cell 中編輯想要存入的 data, 最後點選 Appply

相反的, 如果想要刪除某個欄位, 選取想要刪除的欄位並點選 GUI 中的 Delete the current record


上一篇
D28 - 淺談 Node.js - POST & Middleware & Multer
下一篇
D30 - 活用 SQL 查詢特定資料
系列文
小白大戰基礎網頁開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言